In [54]:
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.io as pio
In [55]:
pio.renderers.default = "plotly_mimetype+notebook"
In [56]:
file_one = pd.read_excel('1.xlsx', index_col=0)
In [57]:
file_two = pd.read_excel('2.xlsx', index_col=0)
In [58]:
merged_files = pd.merge(file_one,file_two, on=['Category', 'site'], suffixes=('_left', '_right'))
In [59]:
merged_files.replace('-' or '', np.nan, inplace=True)
In [60]:
merged_files['viewers_summarised'] = merged_files.iloc[:, 2:].apply(pd.to_numeric, errors='coerce').sum(axis=1)
In [61]:
merged_files['rank_most_viewed'] = merged_files['viewers_summarised'].rank(ascending=False).astype(int)
merged_files = merged_files.sort_values(by='rank_most_viewed', ascending=False)
In [62]:
cols_melt = [col for col in merged_files.columns if col not in ["site", "Category", "viewers_summarised", "rank_most_viewed"]]
df_over_time = merged_files.melt(
    id_vars=["site", "Category"], 
    value_vars=cols_melt,
    ).sort_values(
    by=["site", "Category", "variable"]
    )

Analiza rankingu ogólnego w czasie¶

In [63]:
px.line(data_frame=df_over_time[df_over_time["Category"] == "Ranking ogólny"], x="variable", y="value", color="site")
Analiza wykazuje zróżnicowaną oglądalność w okresie od 01. maja do 1. czerwca.Największym zainteresowaniem cieszą się grupy Google, Facebook i Messenger oraz YouTube. Grupą Google osiąga średnio 21 mln realnych użytkowników dziennie, a grupy Facebook, Messenger i YouTube utrzymując się w granicach 12-14 mln realnych użytkowników dziennie.¶
Na poziomie średnim widoczne są strony takie jak Grupa Polsat Interia, Grupa Agora, Grupa Polska Press oraz Grupa OLX, z wynikiem średnio 5 mln realnych użytkowników dziennie.¶
Natomiast najmniejszą oglądalnością cieszą się strony takie jak librus.pl, Grupa ZPR Media czy Grupa TVN, osiągając średnio 1,85 mln realnych użytkowników dziennie.¶
In [64]:
category_grouped_with_value = df_over_time.groupby(["Category", "variable"])["value"].sum().reset_index()
In [65]:
fig = px.line(
    category_grouped_with_value,
    x="variable",
    y="value",
    color="Category",
    title="Wykres liniowy wartości w czasie dla każdej unikalnej kategorii",
)
fig.show()
Na wykresie "Wykres liniowy wartości w czasie dla każdej unikalnej kategorii" największą popularnością wśród realnych użytkowników cieszy się kategoria 'Ranking ogólny', z liczbą 160 mln realnych użytkowników.¶
Druga najczęściej oglądana kategoria to "Informacje i publicystyka" na poziomie 30-35 mln realnych użytkowników.¶
Kategorie utrzymujące się na średnim poziomie popularności, między 20 mln a 8 mln realnych użytkowników, to m.in.: "Wielotematyczne serwisy kobiece", "Edukacja", "Filmy, seriale, kino", "Programy TV" oraz "Biznes, finanse, prawo".¶
Najmniejszą liczbą realnych użytkowników cieszą się kategorie: "Zdrowy styl życia" oraz "Kuchnia, Gotowanie" na poziomie 4,5 mln realnych użytkowników.¶

Analiza udziałów w rankingu ogólnym¶

In [66]:
category_summarized = merged_files.groupby('Category')['viewers_summarised'].sum()
In [67]:
labels = category_summarized.index
values = category_summarized.values
In [68]:
categ_most_viewed = go.Figure(data=[go.Pie(labels=labels, values=values)])
categ_most_viewed.update_layout(title_text='Jakie kategorie serwisów są najcześciej wyświetlane przez użytkowników: ')
Na powyższym wykresie przedstawiającym 'Najczęściej wyświetlane kategorie serwisów przez użytkowników' zauważamy, że najczęściej wybieraną kategorią przez realnych użytkowników jest 'Ranking ogólny', stanowiący 52% ogółu wyświetleń.¶
Po wykluczeniu kategorii 'Ranking ogólny', obserwujemy, że najczęściej wybieranymi kategoriami przez realnych użytkowników są: 'Informacje i publicystyka' (21,5%), 'Gry i serwisy o grach' (11,6%), oraz 'Biznes, finanse, prawo' (9,48%).¶
Natomiast kategoriami o najmniejszej liczbie wyświetleń przez realnych użytkowników są: 'Budownictwo i wnętrza' (2,86%), 'Kuchnia, gotowanie' (2,48%), oraz 'Zdrowy styl życia' (2,08%).¶
In [69]:
merged_files_view_sort = merged_files.sort_values(by='viewers_summarised', ascending=False)
merged_files_view_sort = merged_files_view_sort[merged_files_view_sort['site'] != 'All selected media channels']
In [70]:
top_20_viewers = merged_files_view_sort.head(20)
In [71]:
fig = go.Figure(data=[go.Bar(x=top_20_viewers['site'], y=top_20_viewers['viewers_summarised'])])
fig.update_layout(title_text='20 stron z największą liczbą realnych użytkowników ')
Na poniższym grafie przedstawiono 20 stron internetowych z największą liczbą realnych użytkowników. Grupa Google znajduje się na pierwszym miejscu z około 614 milionami użytkowników.¶
Następne miejsca zajmują: Aplikacja Facebook (418 mln), Aplikacja Messenger (410 mln) oraz Grupa YouTube (368 mln).¶
W grupie ze średnią ilością realnych użytkowników znajdują się takie strony jak: Aplikacja WhatsApp Messenger (174 mln), Aplikacja Instagram (161 mln) oraz Aplikacja TikTok (149,5 mln).¶
Najmniejszą liczbę realnych użytkowników mają: Grupa RAS Polska (87,5 mln), Grupa Polsat-Interia / Informacje i publicystyka (67,5 mln) oraz Grupa Polska Press / Informacje i publicystyka (64,7 mln).¶

Zadanie 2¶

In [72]:
file = pd.read_excel('dane surowe.xlsx', index_col=0)
In [73]:
file['hit_timestamp'] = pd.to_datetime(file['hit_timestamp'], format='%d.%m.%Y %H:%M')
session_duration = file.groupby('session_id')['hit_timestamp'].max() - file.groupby('session_id')['hit_timestamp'].min()
file['session_duration'] = file['session_id'].map(session_duration)
In [74]:
bins = [0, 300, 600, 1200, float('inf')]
labels = ['Poniżej 5 minut', '5-10 minut', '10-20 minut', 'Powyżej 20 minut']
file['session_duration_category'] = pd.cut(file['session_duration'].dt.total_seconds(), bins=bins, labels=labels)
In [75]:
duration_counts = file['session_duration_category'].value_counts()
In [76]:
fig = px.pie(duration_counts, values=duration_counts.values, names=duration_counts.index, 
             labels={'label': 'Czas trwania sesji'}, title='Głębokość sesji',
             hole=0.3, color_discrete_sequence=px.colors.sequential.RdBu)
In [77]:
fig.show()
Na podstawie przedstawionego wykresu 'Czas trwania sesji' wynika, że w badanym okresie 59,3% sesji użytkowników trwało poniżej 5 minut. Sesje trwające od 5 do 10 minut stanowiły 22,3% wśród realnych użytkowników. Natomiast sesje o długości 10 do 20 minut wystąpiły u 12,1% użytkowników, a pozostałe 6,27% użytkowników miało sesje trwające powyżej 20 minut.¶
In [78]:
session_source_counts = file['session_source_analytics'].value_counts()
In [79]:
fig = px.pie(session_source_counts, names=session_source_counts.index, values=session_source_counts.values,
             title='Rozkład źródeł ruchu')
In [80]:
fig.show()
Najczęstszymi źródłami ruchu dla realnych użytkowników na stronie były:¶
  • Portal Facebook (27,7%)
  • Google Organic (17,2%)
  • Google Discover (12,9%) ##### Ruch generowany przez następujące niektóre wymienione źródła mieścił się na poziomie średnim:
  • Webpush (12,1%)
  • Direct Same Site PPG (11,5%)
  • Direct (9,6%)
Ruch generowany przez następujące źródła mieścił się na poziomie niskim:¶
  • Google news (0,712%)
  • Pozostałe (0,371%)
  • Google CPC (0,0252%)
In [81]:
topic_counts = file['topic'].value_counts()
In [82]:
fig = px.pie(topic_counts, values=topic_counts.values, names=topic_counts.index, title='Najczęściej oglądane tematy: ')
fig.show()
Po usunięciu tematów oznaczonych jako '-', zauważamy, że w wybranej sesji użytkownicy najczęściej odwiedzali serwisy o następującej tematyce: Strona kobiet (26,5%), Dom (18,4%), Sport (16,5%) oraz Historia (11,5%).¶
In [83]:
unique_sessions = file.drop_duplicates(subset='session_id')
In [84]:
topic_counts = unique_sessions['topic'].value_counts().reset_index()
topic_counts.columns = ['topic', 'count']
In [85]:
fig = px.bar(topic_counts, x='topic', y='count', title='Najczęściej oglądane tematy: ')
fig.show()
Po usunięciu tematów oznaczonych jako '-', zauważamy, że w wybranej sesji użytkownicy najczęściej odwiedzali serwisy o następującej tematyce: Strona kobiet (26,5%), Dom (18,4%), Sport (16,5%) oraz Historia (11,5%).¶